Matlab新版S 您所在的位置:网站首页 matlab function模块怎么用 Matlab新版S

Matlab新版S

2024-02-22 06:28| 来源: 网络整理| 查看: 265

目录 前言一、S-Function Builder的界面二、S-Function函数编写1.参数的初始化2.函数的编写 总结

前言

此次我使用的是Matlab2020b上的S-Function Builder,并且使用C语言编写。

提示:以下是本篇文章正文内容

一、S-Function Builder的界面

S-Function Builder界面

二、S-Function函数编写 1.参数的初始化

在这里插入图片描述 在此处可以进行输入输出和函数内部使用的参数进行设置和初始化, 另外需要注意的是,对内部使用的参数进行区别:连续和离散,这里的参数实际上就是我们可以点击S-Function模块进行编辑的参数。 在这里插入图片描述 首先需要确定离散或者连续参数的个数,确定完个数之后,需要对该类型的参数具体是什么进行说明,不同的参数之间用逗号隔开。这里值得注意的是,无论是离散还是连续的parameter,其总个数必须与上面的对应。 另外需要说明的是,离散变量都存储在xD[]的数组中(应该是按你在SETTINGS里面的声明顺序决定的),连续的变量则存储在xC[]中。 确定完之后就可以进行函数的编写了。 因为我这是从DSP中选择的一部分函数,其他的函数都使用模型搭建完毕了,故也懒得将该部分函数整理成.c文件,所以直接在上面编写了。 值得注意的是,Matlab是支持直接导入已经编写好的C函数和H函数的。(但我没试过,主要怕麻烦,说不定出了什么幺蛾子呢)

代码如下(示例):

import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarnings('ignore') import ssl ssl._create_default_https_context = ssl._create_unverified_context 2.函数的编写

一般我们只需要用到void sfbuilder_movingAvg_Outputs_wrapper()和void sfbuilder_movingAvg_Update_wrapper() 这里值得注意的是设置的parameter是Outputs_wrappe函数中是只读的,因为xD[]和xC[]都只在Update_wrapper函数中才能进行更新。 首先说一下变量定义,一般我们的变量定义可以在一开始就定义,使用宏定义的方法,如下代码 宏定义代码如下:

/* Includes_BEGIN */ #include #include #include #define Delata_angle 0.01 #define Pn 5; #define flux 0.2175 #define Ld 0.0034 #define Lq 0.0050 #define R 0.1341 /* Includes_END */ /* Externs_BEGIN */ /* extern double func(double a); */ /* Externs_END */

另外的变量定义方法可以像下面的代码一样定义在前面,也可以定义在Outputs_wrapper的输出函数中。

变量定义代码如下:

#define Delata_angle 0.01 #define Pn 5; #define flux 0.2175 #define Ld 0.0034 #define Lq 0.0050 #define R 0.1341 real_T MTPA_We=0.0; real_T MTPA_Fluxd=0.0; real_T MTPA_Fluxq=0.0; real_T MTPA_Ud=0.0; real_T MTPA_Uq=0.0; real_T Te1=0.0;

void MTPA_BBC_Outputs_wrapper(const real_T *MTPA_Is, const real_T *Nr, const real_T *id_fb, const real_T *iq_fb, real_T *iq, real_T *id, const real_T *xD, const real_T *xC, const real_T *MTPA_Is_angle, const int_T p_width0, const real_T *VariableStep_Search_Flag, const int_T p_width1, const real_T *T_Flag, const int_T p_width2, const real_T *D_Flag, const int_T p_width3, const real_T *MTPA_delata_angle, const int_T p_width4) { /* Output_BEGIN */ real_T MTPA_We=0.0; real_T MTPA_Fluxd=0.0; real_T MTPA_Fluxq=0.0; real_T MTPA_Ud=0.0; real_T MTPA_Uq=0.0; real_T Te1=0.0;

这里需要注意的是变量的类型,这里的real_T指的就是C语言中的double类型。要注意变量类型的统一。 其余部分只要根据C语言的内容进行书写就没什么大问题,但是值得注意的是:将模型定义的parameter赋值给程序中新定义的real_T的参数时会报“pointer value used where a floating point value was expected”这种错误,这样的原因是因为这种方法定义的参数和输入输出的变量一样都是一个数组指针的存储方式,所以需要在该参数的后面加上[0]来引用该数组中的第一个数值。 最后再指出一点,在Matlab中的S函数的if语句的使用与C语言中不同,它不支持if的嵌套。

总结

总体而言S-Function函数用C语言的方式编程的使用方法还是比较简单的,但依旧没有m函数简单,但m函数对我而言有个很大的使用缺陷。比如我想使用当前时刻和上一时刻的差值,或者将当前时刻的值赋给一个之前已经给别的值进行赋值的参数后,m函数的编译器就会报错。我试过将该变量进行输出,并在模块外面加一个延时函数,但这样的效果依旧很麻烦,最后还是报错,我就懒得弄了,使用S函数的C语言编程则没有这样的问题。 由于水平和时间有限,并没有深究,也欢迎各位一起探讨。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有